package com.nextel.project.usuario;

import com.mot.iden.zip.ZipEntry;
import com.mot.iden.zip.ZipInputStream;
import pe.com.nextel.http.MensajeHttp;
import pe.com.nextel.http.XMLListener;
import com.nextel.project.Configuracion;
import com.nextel.project.canje.ControlCanje;
import com.nextel.project.cliente.ControlCliente;
import com.nextel.project.cobranza.ControlCobranza;
import com.nextel.project.cobranza.rms.RMSCobranza;
import com.nextel.project.dao.HttpControl;
import com.nextel.project.dao.XMLDAO;
import com.nextel.project.devolucion.ControlDevolucion;
import com.nextel.project.pedido.ControlPedido;
import com.nextel.project.pedido.bean.PedidoCantidadBean;
import com.nextel.project.usuario.bean.GeneralBean;
import com.nextel.project.usuario.bean.ParametrosBean;
import com.nextel.project.usuario.bean.PendientesBean;
import com.nextel.project.usuario.bean.UsuarioBean;
import com.nextel.project.usuario.mvc.MVCAyuda;
import com.nextel.project.usuario.mvc.MVCConsolidado;
import com.nextel.project.usuario.mvc.MVCEnvio;
import com.nextel.project.usuario.mvc.MVCMantenimiento;
import com.nextel.project.usuario.mvc.MVCMenu;
import com.nextel.project.usuario.mvc.MVCSincronizar;
import com.nextel.project.usuario.mvc.MVCUsuario;
import com.nextel.project.usuario.rms.RMSGeneral;
import com.nextel.project.usuario.rms.RMSParametros;
import com.nextel.project.usuario.rms.RMSUsuario;
import com.nextel.project.util.Fecha;
import pe.com.nextel.main.MVCAction;
import pe.com.nextel.rms.DataInputStreamX;
import pe.com.nextel.rms.RecordStoreInputStream;
import pe.com.nextel.main.ControlBase;
import java.io.InputStream;
import javax.microedition.io.HttpConnection;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import org.kxml2.io.KXmlParser;
import pe.com.nextel.idioma.IdiomaManager;
import pe.com.nextel.util.ArrayList;
import pe.com.nextel.util.List;
import pe.com.nextel.util.HashMap;
import pe.com.nextel.util.StringUtils;

public class ControlUsuario extends ControlBase {

    // <editor-fold defaultstate="collapsed" desc="VARIABLES">
    //llamada a su mismo constructor
    private static final ControlUsuario control = new ControlUsuario();
    public UsuarioBean currentUsuario;
    public ParametrosBean currentParametro;
    public List currentDistribuidoras;
    //rms
    public final RMSUsuario rmsUsuario = new RMSUsuario();
    public final RMSParametros rmsParametros = new RMSParametros();
    public final RMSGeneral rmsGeneral = new RMSGeneral();
    public final RMSCobranza rmsCobranza = new RMSCobranza();
    //vistas
    public final MVCMantenimiento mvcMantenimiento = new MVCMantenimiento();
    public final MVCMenu mvcMenu = new MVCMenu();
    public final MVCUsuario mvcUsuario = new MVCUsuario();
    public final MVCSincronizar mvcSincronizar = new MVCSincronizar();
    public final MVCEnvio mvcEnvio = new MVCEnvio();
    public final MVCConsolidado mvcConsolidado = new MVCConsolidado();
    public final MVCAyuda mvcAyuda = new MVCAyuda();
    //otros
    public HashMap hashGeneral;
    private XMLListener xmlListener;
    public XMLListener xmlListenerPrincipal;
    public static String controlIdioma;

    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="CONSTRUCTOR">
    /**
     * para no crear mas instancias
     */
    private ControlUsuario() {
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="METODOS">
    /**
     * metodo de acceso para instanciar los recordStored
     */
    public static ControlUsuario getInstance() {
        return control;
    }

    public void setXmlListener(XMLListener pxmlListener) {
        xmlListener = pxmlListener;
    }

    // <editor-fold defaultstate="collapsed" desc="Mantenimiento">
    public void validarMantenimiento(String login, String password) {
        if (login.equals(Configuracion.USUARIO_MANT) && password.equals(Configuracion.PASSWORD_MANT)) {
            setCurrent(mvcMantenimiento.showScreen());
        } else {
            showError(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_USUARIO_PASS_INVALIDO), mvcUsuario.showScreen());//"Usuario y/o password invalido"

        }

    }

    public void grabarParametros(ParametrosBean parametro) {
        try {

            rmsParametros.guardarParametro(parametro);

        } catch (Exception e) {

            showError("Error" + e, mvcUsuario.showScreen());

        }
    }

    public ParametrosBean obtenerParametros() {
        try {
            return rmsParametros.obtenerParametro();
        } catch (Exception e) {
            showError("Error" + e, mvcUsuario.showScreen());
        }
        return null;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Usuario">
    /*****************************************************************************/
    public void validarUsuario(String login, String password, String empresa) {
        //#debug
        //System.out.println("Midlet.validarUsuario");
        try {

            if (currentParametro == null) {
                currentParametro = obtenerParametros();
            }
            currentUsuario = null;
            UsuarioBean usuario = new UsuarioBean();
            usuario.setLogin(login);
            usuario.setPassword(password);
            usuario.setCompania(empresa);
            currentUsuario = (usuario);

            getMensajeHttp().setUrl(Configuracion.URL_VALIDARINGRESO);
            getMensajeHttp().setMensaje(currentUsuario.writeXML());

            System.out.println("url =" + Configuracion.URL_VALIDARINGRESO);
            System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));


            // conectar al servidor
            HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_VALIDARUSUARIO);
            iniciarConexionHTTP();

        } catch (Exception e) {

            e.printStackTrace();
            showError("Error : " + e, mvcUsuario.showScreen());

        }
    }

    public void procesarUsuarioOnLine(KXmlParser xml) {
        //#debug
//        System.out.println("Midlet.procesarUsuarioOnLine");
        try {

            UsuarioBean usuario = XMLDAO.getInstance().parseXMLUsuario(xml);

            if (usuario != null) {
                usuario.setLogin(currentUsuario.getLogin());
                usuario.setPassword(currentUsuario.getPassword());

                if (usuario.getCodigo() != null) {
                    currentUsuario = (usuario);
                    currentParametro.setCodDistribuidora(currentUsuario.getCompania());
                    grabarParametros(currentParametro);
                    rmsUsuario.grabarUsuario(currentUsuario);

                    //inicializa los controles
                    getAction().inicializarControlAction();

                    showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_BIENVENIDO) + " " + currentUsuario.getNombres(), mvcMenu.showScreen());//"Bienvenido"

                } else {
                    showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_USUARIO_PASS_INVALIDO_CODIGO), mvcUsuario.showScreen());//"Usuario y/o password invalido (sin código)"

                }
            } else {
                showError(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_USUARIO_PASS_INVALIDO), mvcUsuario.showScreen());//"Usuario y/o password invalido"

            }
        } catch (Exception e) {
            showError(e.getMessage(), mvcUsuario.showScreen());
        }
    }

    /**
     * Cuando el equipo no tiene cobertura y valida con el �ltimo que ingreso <br>
     * al sistema
     * @param mensaje
     */
    public void procesarUsuarioOffLine(String mensaje) {
        System.out.println("procesarUsuarioOffLine");
        try {


            UsuarioBean ultimo = rmsUsuario.getUsuario();

            if (ultimo != null) {
                if (!(currentUsuario.getLogin().trim().equals(ultimo.getLogin().trim())) ||
                        !(currentUsuario.getPassword().trim().equals(ultimo.getPassword().trim()))) {
                    ultimo = null;
                }
            }

            if (ultimo != null) {

                currentUsuario = (ultimo);
                //inicializa los controles
                getAction().inicializarControlAction();
                //+ mensaje
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NO_CONEXION_SERVIDOR), mvcMenu.showScreen());//No hay conexi\u00F3n con el servidor pero login fuera de linea exitoso, puede trabajar sin conexión

            } else {
                showError("Login Error " + mensaje, mvcUsuario.showScreen());
            }
        } catch (Exception e) {
            e.printStackTrace();
            showError("Login Error" + e, mvcUsuario.showScreen());
        }
    }

    /**
     * Cuando sucede un error en la comunicacion del equipo al servidor
     * @param mensaje
     */
    public void comunicacionOffLine(String mensaje, MVCAction mvc) {
        showMensaje(mensaje, mvc.showScreen());
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="General">
    /*****************************************************************************/
    public List getListGeneral(String codigoGrupo) {
        Object object = hashGeneral.get(codigoGrupo);
        if (object != null) {
            return (List) object;
        }
        return null;
    }

    public GeneralBean getGeneral(String codigoGrupo) {
        // System.out.println("data.getGeneral");

        List lista = getListGeneral(codigoGrupo); //RMSDAO.getInstance().getRmsGeneral().getListaGeneral(codigoGrupo);

        if (lista != null && lista.size() > 0) {
            return (GeneralBean) lista.get(0);
        }

        return null;
    }

    /**
     * obtiene la lista de codigos de clientes
     */
    public void getHashListaGeneral() throws Exception {
        List lista = rmsGeneral.getAllLista();
        hashGeneral = new HashMap();

        if (lista != null) {
            String identificador = "";
            List listaParcialAgrupado = null;

            for (int i = 0; i < lista.size(); i++) {
                if (i == 0) {
                    identificador = ((GeneralBean) lista.get(0)).getGrupo();
                    listaParcialAgrupado = new ArrayList();
                }
                if (identificador.equals(((GeneralBean) lista.get(i)).getGrupo())) {
                    listaParcialAgrupado.add(lista.get(i));

                } else {
                    hashGeneral.put(identificador, listaParcialAgrupado);
                    listaParcialAgrupado = new ArrayList();
                    listaParcialAgrupado.add(lista.get(i));
                    identificador = ((GeneralBean) lista.get(i)).getGrupo();

                }

                if (i + 1 == lista.size()) {
                    hashGeneral.put(identificador, listaParcialAgrupado);

                }
            }
        }
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Sincronizar">
    /*****************************************************************************/
    public void eliminarDatos() throws Exception {
        rmsGeneral.deleteAll();
    }

    public void eliminarTODOS() throws Exception {

        ControlUsuario.getInstance().eliminarDatos();

        ControlCliente.getInstance().eliminarDatos();

        if ("1".equals(ControlUsuario.getInstance().currentUsuario.pedido)) {
            ControlPedido.getInstance().eliminarDatos();
        }

        if ("1".equals(ControlUsuario.getInstance().currentUsuario.cobranza)) {
            ControlCobranza.getInstance().eliminarDatos();
        }
        if ("1".equals(ControlUsuario.getInstance().currentUsuario.canje)) {
            ControlCanje.getInstance().eliminarDatos();
        }
        if ("1".equals(ControlUsuario.getInstance().currentUsuario.devolucion)) {
            ControlDevolucion.getInstance().eliminarDatos();
        }
    }

    public String getCantidadSincronizada() throws Exception {
        StringBuffer str = new StringBuffer();

        str.append(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_CLIENTE) + ": ").append(ControlCliente.getInstance().rmsCliente.cantidadObjectLista(Configuracion.RMS_CANTREG)).append(',');//Cliente

        if ("1".equals(ControlUsuario.getInstance().currentUsuario.pedido)) {
            str.append(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ARTICULO) + ": ").append(ControlPedido.getInstance().rmsArticulo.cantidadObjectLista(Configuracion.RMS_CANTREG)).append(',');//Artículo

        }

        if ("1".equals(ControlUsuario.getInstance().currentUsuario.cobranza)) {
            str.append(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_DOC_COBR) + ": ").append(ControlCobranza.getInstance().rmsCobranza.cantidadObject()).append(" C,");//Doc. Cobr

        }

        str.append(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_GENERAL) + ": ").append(ControlUsuario.getInstance().rmsGeneral.cantidadObject()).append(" G \n");//General

        return str.toString();
    }

    public String getCantidadSincronizadaClientes() throws Exception {

        StringBuffer str = new StringBuffer();
        str.append(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_CLIENTE) + ": ").append(ControlCliente.getInstance().rmsCliente.cantidadObjectLista(Configuracion.RMS_CANTREG)).append('\n');//Cliente

        return str.toString();
    }

    public String getCantidadSincronizadaArticulos() throws Exception {
        StringBuffer str = new StringBuffer();
        if ("1".equals(ControlUsuario.getInstance().currentUsuario.pedido)) {
            str.append(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ARTICULO) + ": ").append(ControlPedido.getInstance().rmsArticulo.cantidadObjectLista(Configuracion.RMS_CANTREG)).append('\n');//Artículo

        }
        return str.toString();
    }

    public String getCantidadSincronizadaCobranzas() throws Exception {
        StringBuffer str = new StringBuffer();
        if ("1".equals(ControlUsuario.getInstance().currentUsuario.pedido)) {
            str.append("Doc.Cobr: ").append(ControlCobranza.getInstance().rmsCobranza.cantidadObjectLista(Configuracion.RMS_CANTREG)).append('\n');
        }
        return str.toString();
    }

    public void sincronizar() {
        try {
            if (!StringUtils.withSignal()) {
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_SIN_COBERTURA), this.mvcMenu.showScreen());//"Zona sin cobertura, intente sincronizar mas tarde"

                return;
            }


            // Se quiere enviar solo CodigoUsuario, Codigo Empresa y FechaMovil ---> REUSAMOS PedidoCantidadBean
            PedidoCantidadBean datos = new PedidoCantidadBean();

            datos.setcodUsuario(currentUsuario.getCodigo());
            datos.setcodEmpresa(currentUsuario.getCompania());
            datos.setFechaMovil(Fecha.getFechaActualCompleta());

            getMensajeHttp().setMensaje(datos.writeXML());
            getMensajeHttp().setTipoEnvio(HttpConnection.POST);
            getMensajeHttp().setUrl(Configuracion.URL_SINCRONIZAR);
            HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_SINCRONIZAR);

            System.out.println("url =" + Configuracion.URL_SINCRONIZAR);
            System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));

//            iniciarConexionHTTP();

        } catch (Exception ex) {
            ex.printStackTrace();
            showError("Error " + ex, mvcMenu.showScreen());
        }
    }

    public void sincronizar_clientes() {

        try {

            if (!StringUtils.withSignal()) {
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_SIN_COBERTURA), this.mvcMenu.showScreen());//"Zona sin cobertura, intente sincronizar mas tarde"

                return;
            }

            // Se quiere enviar solo CodigoUsuario, Codigo Empresa y FechaMovil ---> REUSAMOS PedidoCantidadBean

            PedidoCantidadBean datos = new PedidoCantidadBean();

            datos.setcodUsuario(currentUsuario.getCodigo());
            datos.setcodEmpresa(currentUsuario.getCompania());
            datos.setFechaMovil(Fecha.getFechaActualCompleta());

            xmlListener = xmlListenerPrincipal;
            getMensajeHttp().setMensaje(datos.writeXML());
            getMensajeHttp().setTipoEnvio(HttpConnection.POST);
            getMensajeHttp().setUrl(Configuracion.URL_SINCRO_CLIENTES);

            HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_SINCRO_CLIENTES);

            System.out.println("url =" + Configuracion.URL_SINCRO_CLIENTES);
            System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));

            iniciarConexionHTTP();

        } catch (Exception ex) {
            ex.printStackTrace();
            showError("Error " + ex, mvcMenu.showScreen());
        }
    }

    public void sincronizar_productos() {

        try {

            if (!StringUtils.withSignal()) {
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_SIN_COBERTURA), this.mvcMenu.showScreen());//"Zona sin cobertura, intente sincronizar mas tarde"

                return;
            }
            xmlListener = xmlListenerPrincipal;
            getMensajeHttp().setMensaje(currentUsuario.writeXML());
            getMensajeHttp().setTipoEnvio(HttpConnection.POST);
            getMensajeHttp().setUrl(Configuracion.URL_SINCRO_ARTICULOS);

            HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_SINCRO_ARTICULOS);

            System.out.println("url =" + Configuracion.URL_SINCRO_ARTICULOS);
            System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));

            iniciarConexionHTTP();

        } catch (Exception ex) {
            ex.printStackTrace();
            showError("Error " + ex, mvcMenu.showScreen());
        }
    }

    public void sincronizar_cobranzas() {

        try {

            if (!StringUtils.withSignal()) {
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_SIN_COBERTURA), this.mvcMenu.showScreen());//"Zona sin cobertura, intente sincronizar mas tarde"

                return;
            }
            xmlListener = xmlListenerPrincipal;
            getMensajeHttp().setMensaje(currentUsuario.writeXML());
            getMensajeHttp().setTipoEnvio(HttpConnection.POST);
            getMensajeHttp().setUrl(Configuracion.URL_SINCRO_COBRANZAS);

            HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_SINCRO_COBRANZAS);

            System.out.println("url =" + Configuracion.URL_SINCRO_COBRANZAS);
            System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));

            iniciarConexionHTTP();

        } catch (Exception ex) {
            ex.printStackTrace();
            showError("Error " + ex, mvcMenu.showScreen());
        }
    }

    public void procesarSincronizar(MensajeHttp mensajeHttp) {
        try {

            limpiarMemoria();
            limpiarKPI();

            ControlCliente.getInstance().limpiarMemoria();

            if ("1".equals(ControlUsuario.getInstance().currentUsuario.cobranza)) {
                ControlCobranza.getInstance().limpiarMemoria();
            }

            if ("1".equals(ControlUsuario.getInstance().currentUsuario.pedido)) {
                ControlPedido.getInstance().limpiarMemoria();
            }

            eliminarTODOS();
            procesarSincronizarData(mensajeHttp);
            processDownloadedData();

            //obtenemos la cantidad sincronizada
            showMensaje(getCantidadSincronizada(), ControlUsuario.getInstance().mvcMenu.showScreen());

            // contabilizamos el total de clientes
//            if ("1".equals(ControlUsuario.getInstance().currentUsuario.eficiencia)) {
            ControlPedido.getInstance().procesarKpi();
            ControlPedido.getInstance().currentKPI.totalClientes = ControlCliente.getInstance().rmsCliente.cantidadObjectLista(Configuracion.RMS_CANTREG);
            ControlPedido.getInstance().rmsKPI.guardarKPI(ControlPedido.getInstance().currentKPI);
//            }
            System.gc();

        } catch (Exception e) {
            e.printStackTrace();
            showMensaje(e + "", mvcMenu.showScreen());
        }
    }

    public void procesarSincronizarClientes(MensajeHttp mensajeHttp) {
//        System.out.println("procesarSincronizarClientes");
        try {

            limpiarMemoria();
            limpiarKPI();

            if ("1".equals(ControlUsuario.getInstance().currentUsuario.pedido)) {
                ControlPedido.getInstance().limpiarMemoria();
            }

            ControlCliente.getInstance().limpiarMemoria();
            ControlCliente.getInstance().eliminarDatos();

            if ("1".equals(ControlUsuario.getInstance().currentUsuario.cobranza)) {
                ControlCobranza.getInstance().eliminarDatos();
            }

            ControlUsuario.getInstance().eliminarDatos();

            procesarSincronizarData(mensajeHttp);
            processDownloadedData();
            //obtenemos la cantidad sincronizada
            showMensaje(getCantidadSincronizadaClientes(), ControlUsuario.getInstance().mvcMenu.showScreen());

            // contabilizamos el total de clientes
//            if ("1".equals(ControlUsuario.getInstance().currentUsuario.eficiencia)) {
            ControlPedido.getInstance().procesarKpi();
            ControlPedido.getInstance().currentKPI.totalClientes = ControlCliente.getInstance().rmsCliente.cantidadObjectLista(Configuracion.RMS_CANTREG);
            ControlPedido.getInstance().rmsKPI.guardarKPI(ControlPedido.getInstance().currentKPI);
//            }
            System.gc();

        } catch (Exception e) {
            e.printStackTrace();
            showError(e + "", mvcMenu.showScreen());
        }
    }

    public void procesarSincronizarArticulos(MensajeHttp mensajeHttp) {
//        System.out.println("procesarSincronizarArticulos");
        try {

            limpiarMemoria();


            ControlPedido.getInstance().limpiarMemoriaTransacciones();


            ControlPedido.getInstance().eliminarArticulos();

            procesarSincronizarData(mensajeHttp);
            processDownloadedData();
            //obtenemos la cantidad sincronizada
            showMensaje(getCantidadSincronizadaArticulos(), ControlUsuario.getInstance().mvcMenu.showScreen());

            System.gc();

        } catch (Exception e) {
            e.printStackTrace();
            showError(e + "", mvcMenu.showScreen());
        }
    }

    public void procesarSincronizarCobranzas(MensajeHttp mensajeHttp) {
//        System.out.println("procesarSincronizarArticulos");
        try {

            limpiarMemoria();

            if ("1".equals(ControlUsuario.getInstance().currentUsuario.pedido)) {
                ControlPedido.getInstance().limpiarMemoriaTransacciones();
            }
            ControlCobranza.getInstance().limpiarMemoria();
            ControlCobranza.getInstance().eliminarDatos();
            procesarSincronizarData(mensajeHttp);
            processDownloadedData();
            //obtenemos la cantidad sincronizada
            showMensaje(getCantidadSincronizadaCobranzas(), ControlUsuario.getInstance().mvcMenu.showScreen());

            System.gc();

        } catch (Exception e) {
            e.printStackTrace();
            showError(e + "", mvcMenu.showScreen());
        }
    }

    public void procesarSincronizarData(MensajeHttp mensajeHttp) throws Exception {
        //#debug
//        System.out.println("data.procesarSincronizar");

        InputStream input = mensajeHttp.getInput();
        byte[] bufferData = new byte[5120]; //10240 //5120

        int amountData = 0;
        try {
            RecordStore.deleteRecordStore("RS_DOWNLOAD_TMP");
        } catch (RecordStoreException ex) {
//            System.out.println("not found " + ex.getMessage());
        }


        RecordStore rs = null;

        try {
            rs = RecordStore.openRecordStore("RS_DOWNLOAD_TMP", true);

            while ((amountData = input.read(bufferData)) != -1) {
                rs.addRecord(bufferData, 0, amountData);
            }
        } finally {

            try {
                if (rs != null) {
                    rs.closeRecordStore();
                    rs = null;
                }
                bufferData = null;
            } catch (Exception ex) {
                //  System.out.println("final de error = " + ex.getMessage());
            }
        }

    }

    public void processDownloadedData() throws Exception {

        RecordStore rs = null;
        InputStream input = null;
        try {

            rs = RecordStore.openRecordStore("RS_DOWNLOAD_TMP", true);
            input = new RecordStoreInputStream(rs);
            guardarTablas(input);

        } catch (Exception ex) {
            throw ex;
        } finally {
            try {
                if (rs != null) {
                    rs.closeRecordStore();
                    rs = null;
                }
                if (input != null) {
                    input.close();
                    input = null;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                RecordStore.deleteRecordStore("RS_DOWNLOAD_TMP");
            } catch (RecordStoreException e) {
                e.printStackTrace();
            }
        }
    }

    public void guardarTablas(InputStream input) throws Exception {

        ZipInputStream zipInput = new ZipInputStream(input);
        ZipEntry ze = zipInput.getNextEntry();

        DataInputStreamX dataInput = new DataInputStreamX(zipInput);

        String recordStoreName;
        int recordStoreSize;

        RecordStore rs = null;

        try {

            while (true) {

                recordStoreName = dataInput.readString();
                recordStoreSize = dataInput.readInt();

                System.out.println("recordStoreName=" + recordStoreName + "|");
                xmlListener.print(recordStoreName + " size=" + recordStoreSize);

                rs = RecordStore.openRecordStore(recordStoreName, true);
                saveRecordStore(dataInput, recordStoreSize, rs);

                System.out.println("\t-> RS records: " + rs.getNumRecords());

                rs.closeRecordStore();
                rs = null;

                System.gc();
            }

        } catch (Exception ex) {
            System.out.println(" data terminada: " + ex);

        } finally {
            if (rs != null) {
                rs.closeRecordStore();
            }
        }


        zipInput.closeEntry();

        zipInput.close();

        zipInput = null;

    }

    public void saveRecordStore(DataInputStreamX input, int size, RecordStore rs) throws Exception {
        System.out.println("saveRecordStore= " + size);
        byte[] buffer = null;
        int dataReaded = 0;
        int bufferSize = 0;

        buffer = new byte[100000];

        while (dataReaded < size) {

            bufferSize = input.readInt();

            input.readFully(buffer, 0, bufferSize);

            rs.addRecord(buffer, 0, bufferSize);

            dataReaded = dataReaded + bufferSize;
            dataReaded += 4;


        }
        buffer = null;

        System.gc();

    }

    public void limpiarMemoria() {

        if (hashGeneral != null) {
            hashGeneral.clear();
            hashGeneral = null;
        }

        System.gc();
    }

    public void limpiarKPI() {
        try {
//            if ("1".equals(ControlUsuario.getInstance().currentUsuario.eficiencia)) {
            ControlPedido.getInstance().currentKPI = ControlPedido.getInstance().rmsKPI.obtenerKPI();
            if (ControlPedido.getInstance().currentKPI != null) {
                ControlPedido.getInstance().currentKPI.tiempoTotal = 0;
                ControlPedido.getInstance().currentKPI.cantidadPedida = "0";
                ControlPedido.getInstance().currentKPI.clienteVisitados = 0;
                ControlPedido.getInstance().rmsKPI.guardarKPI(ControlPedido.getInstance().currentKPI);
//                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // </editor-fold>

    public void enviarTodos() throws Exception {


        if (!StringUtils.withSignal()) {
            //ControlCliente.getInstance().mvcClienteDetalle.showScreen()
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOCOBERTURA_ENVIO), ControlUsuario.getInstance().mvcEnvio.showScreen());//"Zona sin cobertura, procesar el env\u00EDo mediante la opcion ENVIOS del menu principal"

            return;
        }

        getMensajeHttp().setTipoEnvio(HttpConnection.POST);
        getMensajeHttp().setUrl(Configuracion.URL_ENVIO_TODO);

        List lstPedidos = ControlPedido.getInstance().rmsPedido.getAllBean();
        List listDevoluciones = ControlDevolucion.getInstance().rmsDevolucion.getAllBean();
        List listCanje = ControlCanje.getInstance().rmsCanje.getAllBean();
        List listpago = ControlCobranza.getInstance().rmsPago.getAllBean();

        getMensajeHttp().setMensaje(XMLDAO.getInstance().writeXMLTodo(lstPedidos, listpago, listCanje, listDevoluciones).getBytes());


        System.out.println("url =" + Configuracion.URL_ENVIO_TODO);
        System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));
        HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_TODOS);

        iniciarConexionHTTP();

    }

    public void actualizarTodos(InputStream in) {
        //#debug
        //System.out.println("actualizarTodos");

        try {
            XMLDAO.getInstance().parseMensajeXML(in);
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ENVIO_REGISTRADO), mvcEnvio.showScreen());//"Envio registrado"

            eliminarDatosPendientes();


        } catch (Exception e) {
            e.printStackTrace();

            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOATENDIO_ENVIO) + ": " + e, mvcEnvio.showScreen());//"No se pudo atender el envio"

        }
    }

    public void eliminarDatosPendientes() {

        System.out.println("ControlUsuario.eliminarDatosPendientes");

        try {
            
            ControlPedido.getInstance().limpiarMemoriaTransacciones();
            ControlPedido.getInstance().rmsPedido.deleteAll();
        
            ControlCobranza.getInstance().rmsPago.deleteAll();
            ControlCobranza.getInstance().limpiarMemoria();

            ControlDevolucion.getInstance().limpiarMemoriaTransacciones();
            ControlDevolucion.getInstance().rmsDevolucion.deleteAll();
            
            ControlCanje.getInstance().limpiarMemoriaTransacciones();
            ControlCanje.getInstance().rmsCanje.deleteAll();

        } catch (Exception e) {
            System.out.println("ControlUsuario.eliminarDatosPendientes: " + e.toString());
        }

    }
}
